﻿#region Copyright (c) 2009, Active Web Solutions Ltd.
// Copyright (c) 2009, Active Web Solutions Ltd
// All rights reserved.

// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:

// * Redistributions of source code must retain the above copyright
//   notice, this list of conditions and the following disclaimer.

// * Redistributions in binary form must reproduce the above copyright
//   notice, this list of conditions and the following disclaimer in the
//   documentation and/or other materials provided with the distribution.

// * Neither the name of Active Web Solutions Ltd nor the names of its
//   contributors may be used to endorse or promote products derived from
//   this software without specific prior written permission.

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion

using System;
using System.Configuration;
using System.Diagnostics;
using Aws.SocketShifter;

namespace Client
{
    class Program
    {

        static void Main(string[] args)
        
        {
            Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
            Debug.AutoFlush = true;

            string solutionName = ConfigurationManager.AppSettings["issuerName"];
            string password = ConfigurationManager.AppSettings["issuerSecret"];
            string encryptedIssuerSecret = ConfigurationManager.AppSettings["encryptedIssuerSecret"];
            string servicePath = ConfigurationManager.AppSettings["servicePath"];
            string localAddress = ConfigurationManager.AppSettings["localAddress"];
            int localPort = int.Parse(ConfigurationManager.AppSettings["localPort"]);
            string remoteHost = ConfigurationManager.AppSettings["remoteHost"];
            int remotePort = int.Parse(ConfigurationManager.AppSettings["remotePort"]);

            // Prefer an encrypted secret over a plaintext secret
            if (!string.IsNullOrEmpty(encryptedIssuerSecret))
            {
                password = Util.MachineDecrypt(encryptedIssuerSecret);
            }

            // If no secret has been provided, prompt the user
            if (string.IsNullOrEmpty(password))
            {
                Console.Write("Please enter your issuer secret : ");
                password = Console.ReadLine();

                // Save the encrypted secret for next time
                encryptedIssuerSecret = Util.MachineEncrypyt(password);
                Util.SaveConfigurationSetting("encryptedIssuerSecret", encryptedIssuerSecret);
            }

            SocketShifterClientListener SocketShifterClientListener = new SocketShifterClientListener(solutionName, password, servicePath, localAddress, localPort, remoteHost, remotePort);

            SocketShifterClientListener.Start();

            Debug.WriteLine("SocketShifter Client.");
            Debug.WriteLine(string.Format("Service Path: {0}", servicePath));
            Debug.WriteLine(string.Format("localhost port {0} bridges to remote's {1} port {2}.", localPort, remoteHost, remotePort));
            Debug.WriteLine("Press [Enter] to exit.");
            Console.ReadLine();

            SocketShifterClientListener.Stop();

            Environment.Exit(0); // Blow away any remaining SocketShifterClients
        }
    }
}
